package com.easylinkin.linkappapi.lobar.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.easylinkin.linkappapi.common.model.RequestModel;
import com.easylinkin.linkappapi.lobar.dto.UserClockDTO;
import com.easylinkin.linkappapi.lobar.dto.UserRecordDTO;
import com.easylinkin.linkappapi.lobar.dto.app.AppUserGateDTO;
import com.easylinkin.linkappapi.lobar.dto.app.LobarUserDTO;
import com.easylinkin.linkappapi.lobar.entity.UserClock;
import com.baomidou.mybatisplus.extension.service.IService;
import com.easylinkin.linkappapi.lobar.entity.UserRecord;
import com.easylinkin.linkappapi.lobar.entity.UserStatistics;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;

/**
 * <p>
 * 闸机表 服务类
 * </p>
 *
 * @author kanyuanfeng
 * @since 2022-04-13
 */
public interface UserClockService extends IService<UserClock> {

  IPage<UserClockDTO> queryListByPage(RequestModel<UserClockDTO> requestModel);

  /**
   * 增加
   * @param userClock
   */
  void insert(UserClock userClock);

  /**
   * 根据id编辑
   * @param userClock
   */
  void updateOne(UserClock userClock);

  void delBatch(Set<String> ids);

  /**
   * @Description: 根据条件，分页(不分页)查询考勤报表
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserClockDTO> queryRecordByPage(RequestModel<UserClockDTO> requestModel);

  /**
   * @Description: 根据条件，分页(不分页)查询考勤统计
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserStatistics> queryStatistics(RequestModel<UserClockDTO> requestModel);

  /**
   * @Description: 根据条件，分页(不分页)查询月视图
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserClockDTO> queryMonthByPage(RequestModel<UserClockDTO> requestModel)
      throws InterruptedException, ExecutionException;

  /**
   * 最近5次考勤
   */
  List<UserClockDTO> findLastFive();

  /**
   * 查询个人月考勤记录
   */
  List<UserRecord> getUserMouth(String userId, String mouth);

  /**
   * 根据实际查询当天打卡记录
   */
  List<UserClock> getUserDay(String userId, Date time);

  /**
   * 柱状图(7天考勤统计)
   */
  List<LobarUserDTO> getSevenDay();

  /**
   *app参建单位统计
   */
  List<AppUserGateDTO> getCompany(Date date);

  /**
   *app班组统计
   */
  List<AppUserGateDTO> getGroup(String companyProjectId, Date date);

  /**
   *app班组统计
   */
  List<UserRecordDTO> getUser(String companyProjectId, String groupId, Date date,Integer recordType);

  /**
   * 最近10次打卡记录
   */
  List<UserClockDTO> getTenClock();

  /**
   * 查询出勤人数最多的两个
   */
  List<LobarUserDTO> getBy2WorkType();

  /**
   * 查询班组今日考勤数据
   */
  List<LobarUserDTO> getGroupClock();

  /**
   * 查询作业人员考勤情况
   */
  Map<String, List<LobarUserDTO>> getTaskWorkType();

  /**
   * 手动触发定时任务
   * type = 1 表示触发所有项目
   * 为空  本项目
   */
  void compute(Integer type, Date date);

  /**
   * @Description: 根据条件，导出
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserClockDTO> monthExport(RequestModel<UserClockDTO> requestModel)
      throws InterruptedException, ExecutionException;

  /**
   * @Description: 根据条件，分页(不分页)查询月视图（工时统计）
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserClockDTO> queryMonthHourByPage(RequestModel<UserClockDTO> requestModel) throws InterruptedException, ExecutionException, Exception;

  /**
   * @Description: 根据条件，分页(不分页)查询人员考勤信息
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
    IPage<UserRecordDTO> findRecordByPage(RequestModel<UserClockDTO> requestModel);
}
